package py.com.erpone.session.dm;

import java.util.ArrayList;
import java.util.List;

import javax.ejb.LocalBean;
import javax.ejb.Stateful;
import javax.enterprise.context.Conversation;
import javax.enterprise.context.ConversationScoped;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.inject.Inject;
import javax.inject.Named;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.PersistenceContextType;

import org.primefaces.context.RequestContext;
import org.primefaces.model.DualListModel;

import py.com.erpone.entity.dm.Almacen;
import py.com.erpone.entity.dm.Articulo;
import py.com.erpone.entity.dm.Empresa;
import py.com.erpone.entity.dm.Laboratorio;
import py.com.erpone.entity.dm.Marca;
import py.com.erpone.entity.dm.Medicamento;
import py.com.erpone.entity.dm.Presentacion;
import py.com.erpone.entity.dm.Producto;
import py.com.erpone.session.dm.list.PresentacionList;
import py.com.erpone.session.dm.list.ProductoList;
import py.com.erpone.util.LocaleSelector;


@Stateful
@Named
@LocalBean
@ConversationScoped
public class ProductoBean {

	@PersistenceContext(type=PersistenceContextType.EXTENDED)
	private EntityManager em;

	@Inject
	private PresentacionList presentacionList;

	@Inject
	private LocaleSelector localeSelector;

	@Inject
	private ProductoList productoList;

	@Inject
	private Conversation conversation;

	private DualListModel<Presentacion> presentaciones;

	private Producto producto;

	public Producto getProducto() {
		return producto;
	}

	public void setProveedor(Producto producto) {
		this.producto = producto;
	}

	public void iniciar(){
		if(conversation.isTransient()) conversation.begin();

		producto=new Producto();
		producto.setEmpresa(new Empresa());
		producto.setAlmacen(new Almacen());
		producto.setLaboratorio(new Laboratorio());
		producto.setMarca(new Marca());
		producto.setActivo(true);
		producto.setDTYPE(localeSelector.getMensaje("comun.medicamento"));

		List<Presentacion> source = presentacionList.findAll();

        List<Presentacion> target = new ArrayList<Presentacion>();
        presentaciones = new DualListModel<Presentacion>(source, target);

		//return "/dm/producto.xhtml";
	}

	public DualListModel<Presentacion> getPresentaciones() {
		return presentaciones;
	}

	public void setPresentaciones(DualListModel<Presentacion> presentaciones) {
		this.presentaciones = presentaciones;

//		if(producto == null || producto.getPresentaciones() == null || producto.getId()>0 && producto.getPresentaciones().equals(presentaciones.getTarget()))
//			return;
//		List<Presentacion> lista = new ArrayList<Presentacion>();
//		Long id=0l;
//		String str;
//		Object[] object = presentaciones.getTarget().toArray();
//		for (int i = 0; i < object.length; i++) {
//			str = object[i].toString();
//			String str1 = str.substring(17,str.indexOf(","));
//			id = Long.parseLong(str1);
//			Presentacion item = new Presentacion(id,"");
//			lista.add(item);
//		}
//
//		producto.setPresentaciones(lista);
	}

	public void iniciar(Producto producto){
		if(conversation.isTransient())
			conversation.begin();
		this.producto=producto;
		producto.setDTYPE(localeSelector.getMensaje("comun."+producto.getDTYPE().toString().toLowerCase()+""));
		if(producto.getLaboratorio()==null)producto.setLaboratorio(new Laboratorio());
		if(producto.getMarca()==null)producto.setMarca(new Marca());

		List<Presentacion> source = presentacionList.findAll();
		producto.setPresentaciones(productoList.findAllPresentaciones(producto.getId()));
        List<Presentacion> target = producto.getPresentaciones();
        List<Presentacion> lista =  (List<Presentacion>)((ArrayList<Presentacion>)source).clone();
        for (Presentacion origen : source) {
        	for (Presentacion destino : target) {
				if(origen.equals(destino)){
					lista.remove(lista.indexOf(origen));
					break;
				}
			}
		}
        this.setPresentaciones(new DualListModel<Presentacion>(lista, target));



		//return "/dm/producto.xhtml";
	}


	public void guardar(){
		try {
			producto.setPresentaciones((List<Presentacion>)presentaciones.getTarget());
//			if(producto.getLaboratorio().getId()>0){
			if(producto.getDTYPE().equals(localeSelector.getMensaje("comun.medicamento"))){
				Medicamento m;
				if(producto.getClass().equals(Articulo.class)){
					m = getMedicamento();
					Articulo a = getArticulo();
					em.remove(em.merge(a));
				}else
					m = getMedicamento();
				if(producto.getId()==null){
					em.persist(m);
				    FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, localeSelector.getMensaje("producto_nuevo"), producto.getNombre()));
				}else{
					em.merge(m);
		            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, localeSelector.getMensaje("producto_actualizado"), producto.getNombre()));
				}
			}else{
				producto.setLaboratorio(null);
				Articulo m;
				if(producto.getClass().equals(Medicamento.class)){
					m = getArticulo();
					Medicamento a = getMedicamento();
					em.remove(em.merge(a));
				}else
					m = getArticulo();
				if(producto.getId()==null){
					em.persist(m);
				    FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, localeSelector.getMensaje("producto_nuevo"), producto.getNombre()));
				}else{
					em.merge(m);
		            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, localeSelector.getMensaje("producto_nuevo"), producto.getNombre()));
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		 //El dialog solo se cierra si la lista de contactos y todos los demás campos se completaron
		  //Se mezcla la lógica de negocio con la vista (xhtml), buscar otra alternativa
		  RequestContext rc = RequestContext.getCurrentInstance();
		  rc.execute("dlgProducto.hide()");
		  RequestContext.getCurrentInstance().update("formPrincipal");
		//return "/dm/productos.xhtml";
	}

	public void eliminar(Producto producto){
		//if(producto.getLaboratorio().getId()>0){
		if(producto.getDTYPE().equals(localeSelector.getMensaje("comun.medicamento"))){
			Medicamento m = (Medicamento) producto;
			//em.remove(em.merge(m));
			m.setActivo(false);
			em.merge(m);
			FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, localeSelector.getMensaje("producto_eliminado"), producto.getNombre()));
		}else{
			Articulo m = (Articulo) producto;
			//em.remove(em.merge(m));
			m.setActivo(false);
			em.merge(m);
			FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, localeSelector.getMensaje("producto_eliminado"), producto.getNombre()));
		}
		if(!conversation.isTransient())
			conversation.end();
		//return "/dm/productos.xhtml";
	}

	public String cancelar(){
		if(!conversation.isTransient())
			conversation.end();
		return "/dm/productos.xhtml";
	}


	private Articulo getArticulo(){
		return new Articulo(producto.getId(),
				producto.getNombre(),
				producto.getDescripcion(),
				producto.getEmpresa(),
				producto.getAlmacen(),
				producto.getActivo(),
				producto.getMarca(),
				producto.getLaboratorio(),
				producto.getPresentaciones());
	}

	private Medicamento getMedicamento(){
		return new Medicamento(producto.getId(),
				producto.getNombre(),
				producto.getDescripcion(),
				producto.getEmpresa(),
				producto.getAlmacen(),
				producto.getActivo(),
				producto.getMarca(),
				producto.getLaboratorio(),
				producto.getPresentaciones());
	}
}
